from sympy.integrals.risch import derivation

import Sequence
import draw
import BMI
import solveEquation
import math  # 导入math模块以使用factorial函数
import derivation


def on_keypress(key, display, window):
    # 清空
    if key == "AC":
        display["text"] = ""
    # 删除一个
    elif key == "←":
        display["text"] = display["text"][:-1]
    # 整除
    elif key == "%":
        try:
            expression = eval(display["text"])
            display["text"] = str(expression / 100)
        except:
            display["text"] = "Error"
    # 幂计算（假设使用^表示）
    elif key == "^":
        # 这里我们假设用户将输入如 '2^3' 这样的表达式，所以我们不立即计算
        # 而是在按下=时一起计算
        display["text"] += "^"
    # 阶乘计算（假设使用!表示）
    elif key == "!":
        try:
            # 尝试获取当前数字部分作为阶乘的底数
            num_str = display["text"].strip()  # 去除前后的空格
            if num_str.isdigit() or (num_str.startswith('-') and num_str[1:].isdigit()):
                num = int(num_str)
                result = math.factorial(num)
                display["text"] = str(result)
            else:
                display["text"] += "!"  # 如果不是数字，则假设用户想要输入如 '5!' 这样的表达式
        except:
            display["text"] = "Error"
    elif key == "=":
        try:
            expression = display["text"]
            # 替换操作符为Python支持的格式
            expression = expression.replace("^", "**")
            expression = expression.replace("÷", "/")
            expression = expression.replace("x", "*")
            # 检查是否有阶乘操作符，并尝试计算（这里假设用户输入的是如 '5!' 这样的格式）
            if '!' in expression:
                # 提取阶乘部分
                num_str = ''
                for char in reversed(expression):
                    if char.isdigit() or char == '!':
                        num_str = char + num_str
                    else:
                        break
                num_str = num_str[:-1]  # 去掉最后的'!'
                num = int(num_str)
                factorial_result = math.factorial(num)
                # 替换表达式中的阶乘部分为计算结果
                expression = expression.replace(num_str + '!', str(factorial_result))
            result = eval(expression)
            if isinstance(result, float) and result.is_integer():
                result = int(result)
            display["text"] = str(result)
        except:
            display["text"] = "Error"
    elif key == "draw":
        draw.switch_to_draw(window)
    elif key == "BMI":
        BMI.switch_to_bmi(window)
    elif key == "解方程":
        solveEquation.switch_to_solve(window)
    elif key == "求导":
        derivation.switch(window)
    elif key == "Seq":
        Sequence.switch_to_geometric_sequence(window)
    else:
        if "=" in display["text"]:
            display["text"] = ""
        display["text"] += key
